/*
 * Copyright (c) 2011 Shanda Corporation. All rights reserved.
 *
 * Created on 2011-11-21.
 */

package com.whq.knowverywell.util;

import android.content.Context;
import android.telephony.TelephonyManager;

/**
 * Sim卡相关的工具类.
 *
 * @author wanghuaiqiang
 */
public class SimCardUtil {
    private static final String TAG = "SimUtil";

    /**
     * 判断sim卡是否有效,sim卡有效返回true,否则返回false
     *<p>
     *因为刷卡缘故，不判断状态。
     * @return 
     */
    public static boolean isSimCardValid(Context ctx) {
        try {
            TelephonyManager mgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
            if(mgr!=null)
                return true;
        } catch (Exception e) {
            LogUtil.e(TAG, "获取sim卡状态出错: ", e);
        }
        return false;
    }
    
    /**
     * 获取sim卡号
     * SIM卡唯一标识：IMSI 国际移动用户识别码（IMSI：International Mobile Subscriber Identification Number）是区别移动用户的标志，  
     * 储存在SIM卡中，可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成。
     *      其中MCC为移动国家号码，由3位数字组成，唯一地识别移动客户所属的国家，我国为460；
     *      MNC为网络id，由2位数字组成，用于识别移动客户所归属的移动网络，中国移动为00，中国联通为01,中国电信为03；
     *          因为移动网络编号46000下的IMSI已经用完，所以虚拟了一个46002编号，134/159号段使用了此编号
     *      MSIN为移动客户识别码，采用等长11位数字构成。唯一地识别国内GSM移动通信网中移动客户。
     * 所以要区分是移动还是联通，只需取得SIM卡中的MNC字段即可  
     * @param ctx
     * @return
     */
    public static String getImsi(Context ctx) {
        try {
            TelephonyManager mTelephonyMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
            return mTelephonyMgr.getSubscriberId();
        } catch (Exception e) {
            LogUtil.e(TAG, "获取sim卡出错: ", e);
        }
        return null;
    }
    
    /**
     * 获取sim卡所属国家
     * @return
     */
    public static String getSimCountryIso(Context ctx) {
        try {
            TelephonyManager mTelephonyMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
            return mTelephonyMgr.getSimCountryIso();
        } catch (Exception e) {
            LogUtil.e(TAG, "获取sim卡所属国家出错: ", e);
        }
        return null;
    }
    
    /**
     * sim卡是否是国内的, 国内的返回true, 否则返回false
     * @param ctx 
     * @return 
     */
    public static boolean simCountryIsCn(Context ctx) {
        String simCountryIso = getSimCountryIso(ctx);
        if (simCountryIso == null) {
            return false;
        }
        if ("cn".equals(simCountryIso)) {
            return true;
        }
        return false;
    }
    
    /**
     * 获取sim卡所属运营商
     * @return
     */
    public static String getSimOperator(Context ctx) {
        try {
            TelephonyManager mTelephonyMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
            if(mTelephonyMgr==null){
                return null;
            }
            return mTelephonyMgr.getSimOperator();
        } catch (Exception e) {
            LogUtil.e(TAG, "获取sim卡所属运营商出错: ", e);
        }
        return null;
    }
    
    /**
     * sim卡所属运营商是否是国内的, 国内的返回true, 否则返回false
     * @param ctx
     * @return
     */
    public static boolean simOperatorIsInCn(Context ctx) {
        String simOperator = getSimOperator(ctx);
        if (simOperator == null) {
            return false;
        }
        if (simOperator.startsWith("460")) {
            return true;
        }
        return false;
    }
    
    /**
     * 获取网络运营商
     * @return
     */
    public static String getNetworkOperator(Context ctx) {
        try {
            TelephonyManager mTelephonyMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
            return mTelephonyMgr.getNetworkOperator();
        } catch (Exception e) {
            LogUtil.e(TAG, "获取网络运营商出错: ", e);
        }
        return null;
    }
    
    /**
     * 网络运营商是否是国内的, 国内的返回true, 否则返回false
     * @param ctx
     * @return
     */
    public static boolean networkOperatorIsInCn(Context ctx) {
        String networkOperator = getNetworkOperator(ctx);
        if (networkOperator == null) {
            return true;
        }
        if (StringUtil.isBlank(networkOperator)) {
            return true;
        }
        if (networkOperator.startsWith("460")) {
            return true;
        }
        return false;
    }
    
    /**
     * 从TelephonyManager中获取手机号码
     * @param ctx
     * @return
     */
    public static String getMobileNum(Context ctx) {
        try {
            TelephonyManager mTelephonyMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
            String tel = mTelephonyMgr.getLine1Number();
            if (tel == null) {
                tel = "";
            }
            return tel;
        } catch (Exception e) {
            LogUtil.e(TAG, "从TelephonyManager中获取手机号码出错: ", e);
        }
        return null;
    }
}
